﻿using Newtonsoft.Json;
using NPOI.HSSF.UserModel;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using Org.BouncyCastle.Asn1.Crmf;
using Org.BouncyCastle.Asn1.Ocsp;
using RentHouse.DTO;
using RentHouse.IService;
using RentHouse.Service;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using static System.Net.WebRequestMethods;

namespace RentHouse.Admin.Controllers
{
    public class LogsAllController : Controller
    {

        LogsAllDTO logsAll;
        ILogsAllService logsAllService;

        public LogsAllController(ILogsAllService logsAllService)
        {

            this.logsAllService = logsAllService;
        }


        /// <summary>
        /// 返回日志列表
        /// </summary>
        /// <param name="page"></param>
        /// <param name="limit"></param>
        /// <returns></returns>
        public string GetList(int page, int limit)
        {

            //Response.Headers.Add("Access-Control-Allow-Origin", "*");

            List<LogsAllDTO> list = logsAllService.GetList();

            //字典类（用于存储数据）
            Dictionary<string, object> map = new Dictionary<string, object>();

            map.Add("code", "0");//数据格式或类型
            map.Add("msg", "用户列表信息");//数据声明
            map.Add("count", list.Count);//数据总数（用于分页）
            map.Add("createTime", null);
            map.Add("createBy", null);
            map.Add("updateTime", null);
            map.Add("updateBy", null);
            map.Add("remark", null);

            map.Add("data", list
            .OrderBy(u => u.Id)//分页前必须根据某一列进行排序，保证数据顺序唯一
                .Skip((page - 1) * limit)//执行当前页起始数据
                .Take(limit));//每页条数

            return JsonConvert.SerializeObject(map);
        }

        /// <summary>
        /// 导入Excel文件到指定服务器
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string SetExcelInfo(HttpPostedFileBase myfile)
        {
            //Response.Headers.Add("Access-Control-Allow-Origin", "*");

            if (myfile.ContentLength > 0 && myfile != null)
            {

                //获取当前路径得文件名(包括后缀)用于判断文件类型
                var fileName = myfile.FileName;
                //Path.GetExtension获取当前路径得文件后缀名
                string houzhui = Path.GetExtension(fileName);
                //若是Excel文件就对其进行操作
                if (houzhui.Equals(".xlsx") || houzhui.Equals(".xls"))
                {
                    var filePath = Server.MapPath(string.Format("~/{0}", "File"));
                    //若路径不存在就创建
                    if (!Directory.Exists(filePath))
                    {
                        Directory.CreateDirectory(filePath);
                    }

                    //设置文件名称，防止重命名导致文件替换                    
                    string newFileName = Guid.NewGuid().ToString("N") + houzhui;
                    myfile.SaveAs(Path.Combine(filePath, newFileName));
                    return "success";
                }
                else
                {
                    return "ever";
                }
            }
            else
            {
                return "error";
            }

        }

        /// <summary>
        /// 上传多信息Excel文件到数据库
        /// </summary>
        /// <param name="myfile">HttpPostedFileBase对象如名称而言是一种仅POST文件请求方式（可适用于input文件上传或者Ajax请求的方式），
        ///                   而参数名称 myfile 需要根据前台传递的文件对象名称进行统一匹配</param>
        /// <returns></returns>
        public string DownExcel(HttpPostedFileBase myfile)
        {

            //Response.Headers.Add("Access-Control-Allow-Origin", "*");
            string y = null;
            //首先判断文件是否为空，防止上传null导致代码报错
            if (myfile != null)
            {
                // 创建工作簿HSSFWorkbook是2003 、XSSFWorkbook 是2007版本
                //创建一个IWorkbook类型得对象，用于获取Excepl文件内容
                IWorkbook workbook = null;
                // 获取当前文件得后最名称（用于判断文件是否是Excel文件）
                string fileFuffix = Path.GetExtension(myfile.FileName);
                // 创建工作簿HSSFWorkbook是2003(.xls) 、XSSFWorkbook 是2007版本(.xlsx)
                if (fileFuffix.Equals(".xls"))
                {
                    //inputStream 是输入流  ||   outputStream 是输出流
                    workbook = new HSSFWorkbook(myfile.InputStream);
                }
                else if (fileFuffix.Equals(".xlsx"))
                {
                    workbook = new XSSFWorkbook(myfile.InputStream);
                }
                //首先从workbook中获取第一个sheet(也就是从索引0开始的第一个sheet)
                ISheet sheet = workbook.GetSheetAt(0);
                //获取当前Excel文件得总sheet数（页数）
                //int i = workbook.NumberOfSheets;
                IRow row = sheet.GetRow(0);
                //if ()
                //{

                //}
                for (int i = 0; i < sheet.LastRowNum; i++)
                {
                    LogsAllDTO logsAllDTO = new LogsAllDTO()
                    {
                        UserId = sheet.GetRow(i).GetCell(5).ToString(),
                        Message = sheet.GetRow(i).GetCell(6).ToString(),
                        CreateDateTime = sheet.GetRow(i).GetCell(3).ToString(),
                        ControllerName = sheet.GetRow(i).GetCell(0).ToString(),
                        ActionName = sheet.GetRow(i).GetCell(1).ToString(),
                        Parameters = sheet.GetRow(i).GetCell(2).ToString(),
                        Date = sheet.GetRow(i).GetCell(4).ToString()

                    };
                    y = logsAllService.Add(logsAllDTO);

                }
                return y;
            }
            else
            {
                return "error";
            }
        }

        /// <summary>
        /// 将日志列表信息下载Excel
        /// </summary>
        /// <returns></returns>
        public FileResult DownTLogin()
        {

            // 创建工作簿HSSFWorkbook是2003 、XSSFWorkbook 是2007版本
            IWorkbook workbook = new HSSFWorkbook();
            // 创建工作表45
            ISheet sheet = workbook.CreateSheet("Sheet1");
            //从数据库读出列表
            List<LogsAllDTO> list = logsAllService.GetList();
            //创建第0行
            IRow row0 = sheet.CreateRow(0);
            //给第0行的第1个格子添加数据：序号
            row0.CreateCell(0).SetCellValue("序号");
            //给第0行的第2个格子添加数据：姓名
            row0.CreateCell(1).SetCellValue("控制器类名");
            //给第0行的第3个格子添加数据：密码
            row0.CreateCell(2).SetCellValue("接口名称");
            //给第0行的第4个格子添加数据：邮箱
            row0.CreateCell(3).SetCellValue("参数");
            //给第0行的第4个格子添加数据：邮箱
            row0.CreateCell(4).SetCellValue("访问起始时间");
            //给第0行的第4个格子添加数据：邮箱
            row0.CreateCell(5).SetCellValue("响应时长");
            //给第0行的第4个格子添加数据：邮箱
            row0.CreateCell(6).SetCellValue("操作人");
            //给第0行的第4个格子添加数据：邮箱
            row0.CreateCell(7).SetCellValue("访问状态");
            // 创建行和单元格并填充数据
            for (int rowIndex = 1; rowIndex < list.Count(); rowIndex++)
            {
                //获取list的单个内容
                LogsAllDTO logsAll = list.ElementAt(rowIndex);
                //创建第rowIndex行，rowIndex从1开始，是当前for的循环变量        
                IRow row = sheet.CreateRow(rowIndex);
                //给第rowIndex行， 创建第1个格子  
                var cell0 = row.CreateCell(0);
                //给第rowIndex行的第1个格子 添加数据：{rowIndex+1}
                cell0.SetCellValue($"{rowIndex + 1}");
                //给第rowIndex行， 创建第2个格子  
                var cell1 = row.CreateCell(1);
                //给第rowIndex行的第2个格子 添加数据：admin.Name
                cell1.SetCellValue($"{logsAll.ControllerName}");
                //给第rowIndex行， 创建第3个格子  
                var cell2 = row.CreateCell(2);
                //给第rowIndex行的第3个格子 添加数据：admin.PhoneNum
                cell2.SetCellValue($"{logsAll.ActionName}");
                //给第rowIndex行， 创建第4个格子  
                var cell3 = row.CreateCell(3);
                //给第rowIndex行的第4个格子 添加数据：admin.Email
                cell3.SetCellValue($"{logsAll.Parameters}");
                var cell4 = row.CreateCell(4);
                //给第rowIndex行的第4个格子 添加数据：admin.Email
                cell4.SetCellValue($"{logsAll.CreateDateTime}");
                var cell5 = row.CreateCell(5);
                //给第rowIndex行的第4个格子 添加数据：admin.Email
                cell5.SetCellValue($"{logsAll.Date}");
                var cell6 = row.CreateCell(6);
                //给第rowIndex行的第4个格子 添加数据：admin.Email
                cell6.SetCellValue($"{logsAll.UserId}");
                var cell7 = row.CreateCell(7);
                //给第rowIndex行的第4个格子 添加数据：admin.Email
                cell7.SetCellValue($"{logsAll.Message}");
            }
            // 保存Excel文件
            // 使用MemoryStream保存文件
            using (var memoryStream = new MemoryStream())
            {
                //把创建的excel写入内存文件
                workbook.Write(memoryStream);
                //memoryStream.Position = 0; // 重置流的位置
                // 释放资源
                workbook.Close();
                // 设置返回文件名
                string fileName = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + "日志列表.xls";

                // 返回文件
                return File(memoryStream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
            }
        }

    }
}